<?php
/**
 * Created by PhpStorm.
 * User: nmw
 * Date: 17-10-18
 * Time: 下午4:08
 */

namespace SDK\Wx;

use Vendor\WxPay\WxPayApi;
use Vendor\WxPay\WxPayAppApi;
use Vendor\WxPay\WxPayAppNotify;
use Vendor\WxPay\WxPayUnifiedOrder;

class WxPay
{
    /**
     * @var mixed
     */
    protected $systemName;

    /**
     * @var
     */
    protected $notifyUrl;

    /**
     * WxPay constructor.
     */
    public function __construct()
    {
        $this->systemName = C('systemName');
        $this->notifyUrl = rtrim(C('webSite'), '/') . U('WxPay/notify_url');
    }

    /**
     * 创建App支付参数
     *
     * @param $orderSn
     * @param $total
     * @param string $time
     * @return string
     */
    public function createAppApiPay($orderSn, $total, $time = '')
    {
        // 统一下单类
        $WxPayUnifiedOrder = new WxPayUnifiedOrder();

        //  ---------设置下单相关配置start---------
        $time = empty($time) ? time() : $time;
        // 设置商品或支付单简要描述
        $body = $this->systemName . '-订单编号' . $orderSn;
        $WxPayUnifiedOrder->SetBody($body);

        // 设置商户系统内部的订单号,32个字符内、可包含字母, 其他说明见商户订单号
        $timeStamp = date('mdHis', $time);
        $WxPayUnifiedOrder->SetOut_trade_no($orderSn . $timeStamp);

        // 设置符合ISO 4217标准的三位字母代码，默认人民币：CNY，其他值列表详见货币类型
        // $WxPayUnifiedOrder->SetFee_type('CNY');

        // 设置订单总金额，只能为整数，详见支付金额
        $total = $total * 100;
        // $total = 1;
        $WxPayUnifiedOrder->SetTotal_fee($total);

        // 设置订单生成时间，格式为yyyyMMddHHmmss，如2009年12月25日9点10分10秒表示为20091225091010。
        // $WxPayUnifiedOrder->SetTime_start(date('YmdHis', $time));

        // 设置订单生成时间，格式为yyyyMMddHHmmss，如2009年12月25日9点10分10秒表示为20091225091010。
        // $WxPayUnifiedOrder->SetTime_expire(date('YmdHis', $time + (C('ORDER_EFFECTIVE_TIME') * 3600)));

        // 设置接收微信支付异步通知回调地址
        $WxPayUnifiedOrder->SetNotify_url($this->notifyUrl);

        // 设置取值如下：JSAPI，NATIVE，APP，详细说明见参数规定
        $WxPayUnifiedOrder->SetTrade_type('APP');

        //  ---------设置下单相关配置end---------

        // 获取prepayId
        $WxPayApi = new WxPayApi();
        $result = $WxPayApi::unifiedOrder($WxPayUnifiedOrder, 6);

        $prepayId = $result['prepay_id'];

        // 获取appApi配置
        $WxPayAppApiPay = new WxPayAppApi();
        $jsApiParamter = $WxPayAppApiPay::createParamter($prepayId);

        return $jsApiParamter;
    }

    /**
     * 支付回调
     */
    public function notify_url()
    {
        // 回调入口
        $WxJsApiPayNotify = new WxPayAppNotify();
        // 返回不为空值则表示验证签名成功 可执行相关逻辑操作
        $result = $WxJsApiPayNotify->notifyCallback();

        if (!empty($result))
        {
            $order_sn = substr($result['out_trade_no'], 0, 16);
            $total_fee = (float)$result['total_fee'] / 100;

            $PayController = new PayController();

            $PayController->processOrder($order_sn, $total_fee, 2, $result['out_trade_no'], $result['transaction_id']);
            $wxpaynotify = M('wxpaynotify');
            $wxpaynotify->add($result);
            exit;
        }
        else
        {
            file_put_contents('payfalse', $result . time());
        }
    }
}